// wait 和 notify notifyAll 都是Object 的方法
public class ThreadDemo14 {
    public static void main(String[] args) throws InterruptedException {
        Object object = new Object();
        Object object1 = new Object();
        Thread t1 = new Thread(() -> {
            try {
                synchronized (object) {
                    System.out.println("wait开始");
                    object.wait();
                    // wait 方法必须写在 synchronized代码块里
                    // wait 做的事
                    // 使当前线程阻塞等待
                    // 释放当前的锁
                    // 满足条件唤醒后, 重新尝试获取锁
                    // 结束等待的条件
                    // 其他线程调用 notify 方法
                    // wait 等待时间超时(wait 也可以有参数指定最大等待时间)
                    // 其他线程调用这个线程的 interrupted 方法, 导致 wait 抛出异常
                    System.out.println("wait结束");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (object) {
                System.out.println("notify开始");
                object.notify();
                // 这个也要写在 synchronized 代码块中
                // 通知那些可能等待这个锁的线程, 使它们重新获取这个锁
                // 如果多个线程等待, 随机挑选一个通知
                // notify 后当前线程不会马上释放锁, 会等到synchronized代码块中的语句执行完

                // object.notifyAll();
                // 这个是将所有等待这个锁的线程唤醒, 这几个线程就会锁竞争
                System.out.println("notify结束");
            }
        });

        t1.start();

        Thread.sleep(2000);

        //t1.interrupt();
        t2.start();

    }
}
